﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModelingProjectLib.Interfaces;
using ModelingProjectLib.ImplemEII;
using ModelingProjectLib.ImplemINFO;
using System.Diagnostics;
using System.ComponentModel;
using System.Windows;

namespace INSAwarsWPF
{
    public class UniteViewModel : ViewModelBase
    {
        public Unite UniteModel { get; set; }
        
        public CaseViewModel Conteneur { get; private set; }

        public UniteViewModel(CaseViewModel _cvm, Unite _unite)
        {
            Conteneur = _cvm;
            UniteModel = _unite;
        }

        public string ResumeVie
        {
            get
            {
                return "(" + UniteModel.Vie + "/" + UniteModel.VieMax + ")";
            }
        }

        public string Couleur { get { return CaseViewModel.tabCouleur[UniteModel.Possesseur.Num - 1]; } }
        public string CouleurCode { get { return CaseViewModel.tabCouleurCode[UniteModel.Possesseur.Num - 1]; } }
        public string CheminImage
        {
            get
            {
                if (UniteModel.Type == "Directeur") return "/INSAwarsWPF;component/Images/Unites/directeur_"+Couleur+".png";
                else if (UniteModel.Type == "Enseignant") return "/INSAwarsWPF;component/Images/Unites/enseignant_" + Couleur + ".png";
                else return "/INSAwarsWPF;component/Images/Unites/etudiant_" + Couleur + ".png";
            }
        }

        private bool isSelected;
        public bool IsSelected
        {
            get { return isSelected; }
            set { isSelected = value; RaisePropertyChanged("IsSelected"); }
        }
        
        public bool IsPossedeeParJoueurCourant
        { get { return Conteneur.Conteneur.PartieCourante.JoueurCourant == UniteModel.Possesseur; } }
        public bool IsNotPossedeeParJoueurCourant
        { get { return Conteneur.Conteneur.PartieCourante.JoueurCourant != UniteModel.Possesseur; } }

        //public bool IsEnseignant { get { return UniteModel.Type == "Enseignant"; } }

        public void supprimer()
        {
            Conteneur.Unites.Remove(this);
            Conteneur.SelectedUnite = null;
            Conteneur = null;

            // mise à jour du modèle
            UniteModel.Possesseur.Civilisation.ListUnites.Remove(UniteModel);
            UniteModel = null;

            // suppression ok !
        }

        protected void majUniteApresDeplacement()
        {
            int indNew = UniteModel.ColumnPosition + Conteneur.Conteneur.PartieCourante.CartePartie.Taille * UniteModel.RowPosition;
            CaseViewModel caseOld = Conteneur;
            CaseViewModel caseNew = Conteneur.Conteneur.Cases[indNew];
            
           // if( !(caseOld.SelectedUnite.UniteModel.Mvt < 1)){ A GERER AUTRE PART ! dans deplacerHaut...
                caseOld.Unites.Remove(this);
                caseNew.Unites.Add(this);

                Conteneur = caseNew;
                Conteneur.Conteneur.SelectedCase = caseNew;
                caseNew.SelectedUnite = this;
            /*    caseNew.SelectedUnite.UniteModel.Mvt = caseNew.SelectedUnite.UniteModel.Mvt - 1;
                // Problème de mise à jour au niveau de l'affichage des points de mouvement restant
            }*/

        }

        public bool MouvementPossible
        {
            get {
                /*
                 * useless
                Joueur j_courant = Conteneur.Conteneur.PartieCourante.JoueurCourant;
                int taille = j_courant.Civilisation.ListUnites.Count;
                bool appartientJC = false;

                for (int i = 0; i < taille; i++)
                {
                    if(j_courant.Civilisation.ListUnites[i] == UniteModel) appartientJC = true;// j_courant.Civilisation.ListUnites[i].MvtMax;
                }*/
                return UniteModel.Mvt > 0 && IsPossedeeParJoueurCourant;
            }
        }
        

        public void deplacerHaut()
        {
           if (UniteModel.RowPosition > 0 && MouvementPossible)
            { // on peut déplacer
                UniteModel.Mvt--;
                UniteModel.RowPosition--;
                majUniteApresDeplacement();
            }
        }

        public void deplacerBas()
        {
            if (UniteModel.RowPosition < Conteneur.Conteneur.PartieCourante.CartePartie.Taille-1 && MouvementPossible)
            { // on peut déplacer
                UniteModel.Mvt--;
                UniteModel.RowPosition++;
                majUniteApresDeplacement();
            }
        }

        public void deplacerGauche()
        {
            if (UniteModel.ColumnPosition > 0 && MouvementPossible)
            { // on peut déplacer
                UniteModel.Mvt--;
                UniteModel.ColumnPosition--;
                majUniteApresDeplacement();
            }
        }

        public void deplacerDroite()
        {
            if (UniteModel.ColumnPosition < Conteneur.Conteneur.PartieCourante.CartePartie.Taille - 1 && MouvementPossible)
            { // on peut déplacer
                UniteModel.Mvt--;
                UniteModel.ColumnPosition++;
                majUniteApresDeplacement();
            }
        }
    }
}
